"""
数据库配置模块

该模块负责配置和管理应用的数据库连接，包括：
- 创建异步数据库引擎
- 配置会话管理
- 提供数据库会话依赖
"""

import logging
from sqlalchemy.ext.asyncio import create_async_engine, AsyncSession
from sqlalchemy.orm import sessionmaker, declarative_base
from app.core.config import settings

# 设置 SQLAlchemy 日志级别为 WARNING，避免显示过多的 INFO 级别的 SQL 查询日志
logging.getLogger('sqlalchemy.engine').setLevel(logging.WARNING)

# 创建异步引擎，用于处理数据库连接
# echo=False: 关闭 SQLAlchemy 的 SQL 日志输出
# pool_pre_ping=True: 在每次从连接池获取连接时，先发送一个 SQL 语句测试连接是否仍然有效
# pool_size=5: 连接池中保持的空闲连接数
# max_overflow=10: 连接池中允许的最大溢出连接数
engine = create_async_engine(
    settings.DATABASE_URL,
    echo=False,
    pool_pre_ping=True,
    pool_size=5,
    max_overflow=10
)

# 创建异步会话工厂，用于生成数据库会话
# bind=engine: 绑定之前创建的数据库引擎
# class_=AsyncSession: 指定使用异步会话类
# expire_on_commit=False: 提交事务后不使实例过期，避免不必要的查询
AsyncSessionLocal = sessionmaker(
    bind=engine,
    class_=AsyncSession,
    expire_on_commit=False
)

# 创建声明式基类，用于定义数据库模型
Base = declarative_base()

# 获取数据库会话的依赖函数，用于 FastAPI 的依赖注入系统
# 使用异步上下文管理器确保会话在使用后正确关闭
async def get_db():
    async with AsyncSessionLocal() as session:
        try:
            yield session
            await session.commit()
        except Exception:
            await session.rollback()
            raise
        finally:
            await session.close()